/**
 * ---- Classe CkSOl----
 *  * Première famille Ck : <BR>
 *      - Courbe initiale : C 1: Un segment défini par les coordonnées de ses deux extrémités.<BR>
 *      - Règle de transformation : On obtient C k+1 à partir de Ck en remplaçant chaque segment S de Ck 
 *                                  par les deux autres côtés du triangle rectangle isocèle dont S est la base, 
 *                                  et en conservant toujours la même orientation. <BR>
 * @author Alexandre Boursier, Nolan Potier <BR>
 * @version 20/12/2011
 *
 */

package exercice_1;

import java.awt.*;

public class CkSol extends Ck{

    private static final long serialVersionUID = 597020610287322366L;
    
    /**
     * Constructeur normal
     * 
     * @param profondeur
     *          le nombre d'itérations
     */
    public CkSol(int profondeur) {
        super(profondeur);
    }

    /**
     * Méthode récursive pour dessiner les éléments de la classe Ck selon une profondeur k donnée <BR>
     * 
     * @param x1 
     *          Abscisse du premier point du segment cible
     * @param x2
     *          Abscisse du second point du segment cible
     * @param y1 
     *          Ordonnée du premier point du segment cible
     * @param y2 
     *          Ordonnée du second point du segment cible
     * @param k  
     *          Profondeur de la récursion
     * @param drawingArea 
     *          Outil nécessaire au dessin 
     * 
     */
    @Override
    public void drawCk(int x1, int y1, int x2, int y2, int k, Graphics drawingArea) {
        if(k<1)
        {
            System.out.println("Impossible de construire la courbe récursive");
            System.out.println("k = " + k + ", Problème de profondeur");
        }
        // Traiter le cas initial (ou cas de retour)
        else if (k==1) {
            // Dessiner une ligne ayant les caractéristiques propres de celles renseignées
            drawingArea.drawLine(x1,y1,x2,y2);
        }
        // Le calcul récursif inclus une valeur supérieure à 1 pour témoigner de son operationnalité
        else 
        { 
            // Traiter le cas du calcul du troisième sommet
            int abscisseTroisiemePoint = x1 - ((y2-y1)/2)+((x2-x1)/2);
            int ordonneeTroisiemePoint = y1 + ((y2-y1)/2)+((x2-x1)/2);
            Point sommet = new Point(abscisseTroisiemePoint,ordonneeTroisiemePoint);

            // Construction du triangle selon le segment existant
            drawCk(x1,y1,sommet.x,sommet.y,k-1,drawingArea);
            drawCk(sommet.x,sommet.y,x2,y2,k-1,drawingArea);
        }
    }

}